package com.example.mq.RabbitMQ;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author Jason
 * @PACKAGE_NAME com.example.mq.RabbitMQ
 * @Description 生产者
 * @date 2023-11-22 15:30
 */
public class 生产者 {
    public static void main(String[] args) throws IOException, TimeoutException {

        String queueName = "队列名称";
        String exchangeName = "交换机名称";

//        创建一个连接工厂
        ConnectionFactory factory = new ConnectionFactory();
//        服务地址
        factory.setHost("localhost");
//        账号
        factory.setUsername("guest");
//        密码
        factory.setPassword("guest");
//        端口号
        factory.setPort(5672);
//        创建连接
        Connection connection = factory.newConnection();
//        创建信道
        Channel channel = connection.createChannel();

        /*
         * 创建交换机
         * 1.交换机名称
         * 2.交换机类型，direct，topic，fanout和headers
         * 3.指定交换机是否需要持久化：true交换机元数据要持久化
         * 4.指定交换机在没有队列绑定时，是否需要删除，设置false是不删除
         * 5.Map<String, Object>类型，用来指定交换机其他的结构化参数
         */
        channel.exchangeDeclare(exchangeName, BuiltinExchangeType.DIRECT,true,false,null);

        /*
        * 生成一个队列
        * 1.队列名称
        * 2.队列是否需要持久化，注意：只是队列名称等这些元数据的持久化，不是队列中消息的持久化
        * 3.标识队列是不是私有的，如果是私有的，那只有创建它的应用程序才能消费消息
        * 4.队列在没有消费者订阅的情况下，是否自动删除
        * 5.队列的结构化信息，比如生命死信队列，磁盘队列会用到
        */
        channel.queueDeclare(queueName,true,false,false,null);

        /*
        * 队列和交换机绑定
        * 1.队列名称
        * 2.交换机名称
        * 2.路由键，直连模式下，可以为队列名称
        * */

        channel.queueBind(queueName,exchangeName,queueName);

//        发送消息
        String message = "hello rabbitmq";

        /*
        * 发送消息
        * 1.发送到哪个的交换机（交换机名称）
        * 2.队列名称
        * 3.其他参数信息，没有就填空
        * 4.发送消息的消息体，字节
        * */
        channel.basicPublish(exchangeName,queueName,null,message.getBytes());

//        关闭
        channel.close();
        connection.close();
    }
}
